package eu.expressis.eiaf.core.infrastructure.util;

import java.util.Collection;
import java.util.Properties;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.dialect.Dialect;
import org.hibernate.ejb.Ejb3Configuration;

/**
 * SQL Creator for Tables according to JPA/Hibernate annotations. Use: {@link #createTablesScript()} To create the table
 * creationg script {@link #dropTablesScript()} to create the table destruction script
 */
public class SqlTableCreator {

  private final AnnotationConfiguration hibernateConfiguration;
  private final Properties dialectProps;

  public SqlTableCreator(final Collection<Class> entities) {

    final Ejb3Configuration ejb3Configuration = new Ejb3Configuration();
    for(final Class entity : entities) {
      ejb3Configuration.addAnnotatedClass(entity);
    }

    dialectProps = new Properties();
    dialectProps.put("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");

    hibernateConfiguration = ejb3Configuration.getHibernateConfiguration();
  }

  /**
   * Create the SQL script to create all tables.
   * 
   * @return A {@link String} representing the SQL script.
   */
  public String createTablesScript() {
    final StringBuilder script = new StringBuilder();

    final String[] creationScript = hibernateConfiguration.generateSchemaCreationScript(Dialect
        .getDialect(dialectProps));
    for(final String string : creationScript) {
      script.append(string).append(";\n");
    }
    script.append("\ngo\n\n");

    return script.toString();
  }

  /**
   * Create the SQL script to drop all tables.
   * 
   * @return A {@link String} representing the SQL script.
   */
  public String dropTablesScript() {
    final StringBuilder script = new StringBuilder();

    final String[] creationScript = hibernateConfiguration.generateDropSchemaScript(Dialect.getDialect(dialectProps));
    for(final String string : creationScript) {
      script.append(string).append(";\n");
    }
    script.append("\ngo\n\n");

    return script.toString();
  }
}
